﻿using System;

namespace MimicAPI.Window
{
    /// <summary>Have a look on "http://msdn2.microsoft.com/en-us/library/ms633584.aspx" to get information on GetWindowLong</summary>
    enum GetWindowLongValue
    {
        /// <summary>Retrieves the address of the window procedure, or a handle representing the address of the window procedure.</summary>
        GWL_WNDPROC = -4,
        /// <summary>Retrieves a handle to the application instance.</summary>
        GWL_HINSTANCE = -6,
        /// <summary>Retrieves a handle to the parent window, if any.</summary>
        GWL_HWNDPARENT = -8,
        /// <summary>Retrieves the window styles.</summary>
        GWL_STYLE = -16,
        /// <summary>Retrieves the extended window styles.</summary>
        GWL_EXSTYLE = -20,
        /// <summary>
        /// Retrieves the user data associated with the window.
        /// This data is intended for use by the application that created the window. Its value is initially zero.
        /// </summary>
        GWL_USERDATA = -21,
        /// <summary>Retrieves the identifier of the window.</summary>
        GWL_ID = -12
    }

    /// <summary>Have a look on "http://www.pinvoke.net/default.aspx/Enums/WindowsMessages.html" to get information on Window Messages</summary>
    enum WindowMessages
    {
        WM_ACTIVATE = 0x6,
        WM_ACTIVATEAPP = 0x1C,
        WM_AFXFIRST = 0x360,
        WM_AFXLAST = 0x37F,
        WM_APP = 0x8000,
        WM_ASKCBFORMATNAME = 0x30C,
        WM_CANCELJOURNAL = 0x4B,
        WM_CANCELMODE = 0x1F,
        WM_CAPTURECHANGED = 0x215,
        WM_CHANGECBCHAIN = 0x30D,
        WM_CHAR = 0x102,
        WM_CHARTOITEM = 0x2F,
        WM_CHILDACTIVATE = 0x22,
        WM_CLEAR = 0x303,
        WM_CLOSE = 0x10,
        WM_COMMAND = 0x111,
        WM_COMPACTING = 0x41,
        WM_COMPAREITEM = 0x39,
        WM_CONTEXTMENU = 0x7B,
        WM_COPY = 0x301,
        WM_COPYDATA = 0x4A,
        WM_CREATE = 0x1,
        WM_CTLCOLORBTN = 0x135,
        WM_CTLCOLORDLG = 0x136,
        WM_CTLCOLOREDIT = 0x133,
        WM_CTLCOLORLISTBOX = 0x134,
        WM_CTLCOLORMSGBOX = 0x132,
        WM_CTLCOLORSCROLLBAR = 0x137,
        WM_CTLCOLORSTATIC = 0x138,
        WM_CUT = 0x300,
        WM_DEADCHAR = 0x103,
        WM_DELETEITEM = 0x2D,
        WM_DESTROY = 0x2,
        WM_DESTROYCLIPBOARD = 0x307,
        WM_DEVICECHANGE = 0x219,
        WM_DEVMODECHANGE = 0x1B,
        WM_DISPLAYCHANGE = 0x7E,
        WM_DRAWCLIPBOARD = 0x308,
        WM_DRAWITEM = 0x2B,
        WM_DROPFILES = 0x233,
        WM_ENABLE = 0xA,
        WM_ENDSESSION = 0x16,
        WM_ENTERIDLE = 0x121,
        WM_ENTERMENULOOP = 0x211,
        WM_ENTERSIZEMOVE = 0x231,
        WM_ERASEBKGND = 0x14,
        WM_EXITMENULOOP = 0x212,
        WM_EXITSIZEMOVE = 0x232,
        WM_FONTCHANGE = 0x1D,
        WM_GETDLGCODE = 0x87,
        WM_GETFONT = 0x31,
        WM_GETHOTKEY = 0x33,
        WM_GETICON = 0x7F,
        WM_GETMINMAXINFO = 0x24,
        WM_GETOBJECT = 0x3D,
        WM_GETSYSMENU = 0x313,
        WM_GETTEXT = 0xD,
        WM_GETTEXTLENGTH = 0xE,
        WM_HANDHELDFIRST = 0x358,
        WM_HANDHELDLAST = 0x35F,
        WM_HELP = 0x53,
        WM_HOTKEY = 0x312,
        WM_HSCROLL = 0x114,
        WM_HSCROLLCLIPBOARD = 0x30E,
        WM_ICONERASEBKGND = 0x27,
        WM_IME_CHAR = 0x286,
        WM_IME_COMPOSITION = 0x10F,
        WM_IME_COMPOSITIONFULL = 0x284,
        WM_IME_CONTROL = 0x283,
        WM_IME_ENDCOMPOSITION = 0x10E,
        WM_IME_KEYDOWN = 0x290,
        WM_IME_KEYLAST = 0x10F,
        WM_IME_KEYUP = 0x291,
        WM_IME_NOTIFY = 0x282,
        WM_IME_REQUEST = 0x288,
        WM_IME_SELECT = 0x285,
        WM_IME_SETCONTEXT = 0x281,
        WM_IME_STARTCOMPOSITION = 0x10D,
        WM_INITDIALOG = 0x110,
        WM_INITMENU = 0x116,
        WM_INITMENUPOPUP = 0x117,
        WM_INPUTLANGCHANGE = 0x51,
        WM_INPUTLANGCHANGEREQUEST = 0x50,
        WM_KEYDOWN = 0x100,
        WM_KEYFIRST = 0x100,
        WM_KEYLAST = 0x108,
        WM_KEYUP = 0x101,
        WM_KILLFOCUS = 0x8,
        WM_LBUTTONDBLCLK = 0x203,
        WM_LBUTTONDOWN = 0x201,
        WM_LBUTTONUP = 0x202,
        WM_MBUTTONDBLCLK = 0x209,
        WM_MBUTTONDOWN = 0x207,
        WM_MBUTTONUP = 0x208,
        WM_MDIACTIVATE = 0x222,
        WM_MDICASCADE = 0x227,
        WM_MDICREATE = 0x220,
        WM_MDIDESTROY = 0x221,
        WM_MDIGETACTIVE = 0x229,
        WM_MDIICONARRANGE = 0x228,
        WM_MDIMAXIMIZE = 0x225,
        WM_MDINEXT = 0x224,
        WM_MDIREFRESHMENU = 0x234,
        WM_MDIRESTORE = 0x223,
        WM_MDISETMENU = 0x230,
        WM_MDITILE = 0x226,
        WM_MEASUREITEM = 0x2C,
        WM_MENUCHAR = 0x120,
        WM_MENUCOMMAND = 0x126,
        WM_MENUDRAG = 0x123,
        WM_MENUGETOBJECT = 0x124,
        WM_MENURBUTTONUP = 0x122,
        WM_MENUSELECT = 0x11F,
        WM_MOUSEACTIVATE = 0x21,
        WM_MOUSEFIRST = 0x200,
        WM_MOUSEHOVER = 0x2A1,
        WM_MOUSELAST = 0x20A,
        WM_MOUSELEAVE = 0x2A3,
        WM_MOUSEMOVE = 0x200,
        WM_MOUSEWHEEL = 0x20A,
        WM_MOVE = 0x3,
        WM_MOVING = 0x216,
        WM_NCACTIVATE = 0x86,
        WM_NCCALCSIZE = 0x83,
        WM_NCCREATE = 0x81,
        WM_NCDESTROY = 0x82,
        WM_NCHITTEST = 0x84,
        WM_NCLBUTTONDBLCLK = 0xA3,
        WM_NCLBUTTONDOWN = 0xA1,
        WM_NCLBUTTONUP = 0xA2,
        WM_NCMBUTTONDBLCLK = 0xA9,
        WM_NCMBUTTONDOWN = 0xA7,
        WM_NCMBUTTONUP = 0xA8,
        WM_NCMOUSEHOVER = 0x2A0,
        WM_NCMOUSELEAVE = 0x2A2,
        WM_NCMOUSEMOVE = 0xA0,
        WM_NCPAINT = 0x85,
        WM_NCRBUTTONDBLCLK = 0xA6,
        WM_NCRBUTTONDOWN = 0xA4,
        WM_NCRBUTTONUP = 0xA5,
        WM_NEXTDLGCTL = 0x28,
        WM_NEXTMENU = 0x213,
        WM_NOTIFY = 0x4E,
        WM_NOTIFYFORMAT = 0x55,
        WM_NULL = 0x0,
        WM_PAINT = 0xF,
        WM_PAINTCLIPBOARD = 0x309,
        WM_PAINTICON = 0x26,
        WM_PALETTECHANGED = 0x311,
        WM_PALETTEISCHANGING = 0x310,
        WM_PARENTNOTIFY = 0x210,
        WM_PASTE = 0x302,
        WM_PENWINFIRST = 0x380,
        WM_PENWINLAST = 0x38F,
        WM_POWER = 0x48,
        WM_PRINT = 0x317,
        WM_PRINTCLIENT = 0x318,
        WM_QUERYDRAGICON = 0x37,
        WM_QUERYENDSESSION = 0x11,
        WM_QUERYNEWPALETTE = 0x30F,
        WM_QUERYOPEN = 0x13,
        WM_QUERYUISTATE = 0x129,
        WM_QUEUESYNC = 0x23,
        WM_QUIT = 0x12,
        WM_RBUTTONDBLCLK = 0x206,
        WM_RBUTTONDOWN = 0x204,
        WM_RBUTTONUP = 0x205,
        WM_RENDERALLFORMATS = 0x306,
        WM_RENDERFORMAT = 0x305,
        WM_SETCURSOR = 0x20,
        WM_SETFOCUS = 0x7,
        WM_SETFONT = 0x30,
        WM_SETHOTKEY = 0x32,
        WM_SETICON = 0x80,
        WM_SETREDRAW = 0xB,
        WM_SETTEXT = 0xC,
        WM_SETTINGCHANGE = 0x1A,
        WM_SHOWWINDOW = 0x18,
        WM_SIZE = 0x5,
        WM_SIZECLIPBOARD = 0x30B,
        WM_SIZING = 0x214,
        WM_SPOOLERSTATUS = 0x2A,
        WM_STYLECHANGED = 0x7D,
        WM_STYLECHANGING = 0x7C,
        WM_SYNCPAINT = 0x88,
        WM_SYSCHAR = 0x106,
        WM_SYSCOLORCHANGE = 0x15,
        WM_SYSCOMMAND = 0x112,
        WM_SYSDEADCHAR = 0x107,
        WM_SYSKEYDOWN = 0x104,
        WM_SYSKEYUP = 0x105,
        /// <summary>undocumented, see http://support.microsoft.com/?id=108938</summary>
        WM_SYSTIMER = 0x118,
        WM_TCARD = 0x52,
        WM_TIMECHANGE = 0x1E,
        WM_TIMER = 0x113,
        WM_UNDO = 0x304,
        WM_UNINITMENUPOPUP = 0x125,
        WM_USER = 0x400,
        WM_USERCHANGED = 0x54,
        WM_VKEYTOITEM = 0x2E,
        WM_VSCROLL = 0x115,
        WM_VSCROLLCLIPBOARD = 0x30A,
        WM_WINDOWPOSCHANGED = 0x47,
        WM_WINDOWPOSCHANGING = 0x46,
        WM_WININICHANGE = 0x1A,
        WM_XBUTTONDBLCLK = 0x20D,
        WM_XBUTTONDOWN = 0x20B,
        WM_XBUTTONUP = 0x20C
    }

    /// <summary>Have a look on "https://msdn2.microsoft.com/en-us/library/ms645618.aspx" to get information on Mouse Position Codes (Hit Test)</summary>
    enum MousePositionCodes
    {
        /// <summary>
        /// On the screen background or on a dividing line between windows
        /// (same as HTNOWHERE, except that the DefWindowProc function produces a system beep to indicate an error).
        /// </summary>
        HTERROR = (-2),
        /// <summary>
        /// In a window currently covered by another window in the same thread
        /// (the message will be sent to underlying windows in the same thread until one of them returns a code that is not HTTRANSPARENT).
        /// </summary>
        HTTRANSPARENT = (-1),
        /// <summary>On the screen background or on a dividing line between windows.</summary>
        HTNOWHERE = 0,
        /// <summary>In a client area.</summary>
        HTCLIENT = 1,
        /// <summary>In a title bar.</summary>
        HTCAPTION = 2,
        /// <summary>In a window menu or in a Close button in a child window.</summary>
        HTSYSMENU = 3,
        /// <summary>In a size box (same as HTSIZE).</summary>
        HTGROWBOX = 4,
        /// <summary>In a menu.</summary>
        HTMENU = 5,
        /// <summary>In a horizontal scroll bar.</summary>
        HTHSCROLL = 6,
        /// <summary>In the vertical scroll bar.</summary>
        HTVSCROLL = 7,
        /// <summary>In a Minimize button.</summary>
        HTMINBUTTON = 8,
        /// <summary>In a Maximize button.</summary>
        HTMAXBUTTON = 9,
        /// <summary>In the left border of a resizable window (the user can click the mouse to resize the window horizontally).</summary>
        HTLEFT = 10,
        /// <summary>In the right border of a resizable window (the user can click the mouse to resize the window horizontally).</summary>
        HTRIGHT = 11,
        /// <summary>In the upper-horizontal border of a window.</summary>
        HTTOP = 12,
        /// <summary>In the upper-left corner of a window border.</summary>
        HTTOPLEFT = 13,
        /// <summary>In the upper-right corner of a window border.</summary>
        HTTOPRIGHT = 14,
        /// <summary>In the lower-horizontal border of a resizable window (the user can click the mouse to resize the window vertically).</summary>
        HTBOTTOM = 15,
        /// <summary>In the lower-left corner of a border of a resizable window (the user can click the mouse to resize the window diagonally).</summary>
        HTBOTTOMLEFT = 16,
        /// <summary>In the lower-right corner of a border of a resizable window (the user can click the mouse to resize the window diagonally).</summary>
        HTBOTTOMRIGHT = 17,
        /// <summary>In the border of a window that does not have a sizing border.</summary>
        HTBORDER = 18,
        /// <summary>In a Minimize button.</summary>
        HTREDUCE = HTMINBUTTON,
        /// <summary>In a Maximize button.</summary>
        HTZOOM = HTMAXBUTTON,
        /// <summary>In a size box (same as HTGROWBOX).</summary>
        HTSIZE = HTGROWBOX,
        /// <summary></summary>
        HTSIZEFIRST = HTLEFT,
        /// <summary></summary>
        HTSIZELAST = HTBOTTOMRIGHT,
        /// <summary></summary>
        HTOBJECT = 19,
        /// <summary>In a Close button.</summary>
        HTCLOSE = 20,
        /// <summary>In a Help button.</summary>
        HTHELP = 21
    }

    // TODO : Here is only the used values... Get all codes to have an exhaustive enum !
    enum StateWindow
    {
        SW_HIDE = 0,
        SW_MAXIMIZE = 3,
        SW_SHOW = 5,
        SW_MINIMIZE = 6,
        SW_SHOWNA = 8
    }

    enum GetWndCmd : uint
    {
        First = 0,
        Last = 1,
        Next = 2,
        Prev = 3,
        Owner = 4,
        Child = 5,
        EnabledPopup = 6
    }

    /// <summary>Have a look on "http://msdn2.microsoft.com/en-us/library/czada357(vs.90).aspx" to get information on Window Styles</summary>
    [Flags]
    enum WindowStyles : uint
    {
        /// <summary>Overlapped window. An overlapped window usually has a caption and a border.</summary>
        WS_OVERLAPPED = 0x00000000,
        /// <summary>Pop-up window. Cannot be used with the WS_CHILD style.</summary>
        WS_POPUP = 0x80000000,
        /// <summary>Child window. Cannot be used with the WS_POPUP style.</summary>
        WS_CHILD = 0x40000000,
        /// <summary>Window that is initially minimized. For use with the WS_OVERLAPPED style only.</summary>
        WS_MINIMIZE = 0x20000000,
        /// <summary>Window that is initially visible.</summary>
        WS_VISIBLE = 0x10000000,
        /// <summary>Window that is initially disabled.</summary>
        WS_DISABLED = 0x08000000,
        /// <summary>
        /// Clips child windows relative to each other;
        /// that is, when a particular child window receives a paint message, the WS_CLIPSIBLINGS style
        /// clips all other overlapped child windows out of the region of the child window to be updated.
        /// (If WS_CLIPSIBLINGS is not given and child windows overlap, when you draw within the client area
        /// of a child window, it is possible to draw within the client area of a neighboring child window.)
        /// For use with the WS_CHILD style only.
        /// </summary>
        WS_CLIPSIBLINGS = 0x04000000,
        /// <summary>
        /// Excludes the area occupied by child windows when you draw within the parent window. Used when you create the parent window.</summary>
        WS_CLIPCHILDREN = 0x02000000,
        /// <summary>Window of maximum size.</summary>
        WS_MAXIMIZE = 0x01000000,
        /// <summary>Window that has a border.</summary>
        WS_BORDER = 0x00800000,
        /// <summary>Window with a double border but no title.</summary>
        WS_DLGFRAME = 0x00400000,
        /// <summary>Window that has a vertical scroll bar.</summary>
        WS_VSCROLL = 0x00200000,
        /// <summary>Window that has a horizontal scroll bar.</summary>
        WS_HSCROLL = 0x00100000,
        /// <summary>Window that has a Control-menu box in its title bar. Used only for windows with title bars.</summary>
        WS_SYSMENU = 0x00080000,
        /// <summary>Window with a thick frame that can be used to size the window.</summary>
        WS_THICKFRAME = 0x00040000,
        /// <summary>
        /// Specifies the first control of a group of controls in which the user can move from one
        /// control to the next with the arrow keys. All controls defined with the WS_GROUP style
        /// FALSE after the first control belong to the same group. The next control with the
        /// WS_GROUP style starts the next group (that is, one group ends where the next begins).
        /// </summary>
        WS_GROUP = 0x00020000,
        /// <summary>
        /// Specifies one of any number of controls through which the user can move by using the TAB key.
        /// The TAB key moves the user to the next control specified by the WS_TABSTOP style.
        /// </summary>
        WS_TABSTOP = 0x00010000,

        /// <summary>Window that has a Minimize button.</summary>
        WS_MINIMIZEBOX = 0x00020000,
        /// <summary>Window that has a Maximize button.</summary>
        WS_MAXIMIZEBOX = 0x00010000,

        /// <summary>Window that has a title bar (implies the WS_BORDER style). Cannot be used with the WS_DLGFRAME style.</summary>
        WS_CAPTION = WS_BORDER | WS_DLGFRAME,
        /// <summary>Creates an overlapped window. An overlapped window has a title bar and a border. Same as the WS_OVERLAPPED style.</summary>
        WS_TILED = WS_OVERLAPPED,
        /// <summary>Window that is initially minimized. Same as the WS_MINIMIZE style.</summary>
        WS_ICONIC = WS_MINIMIZE,
        /// <summary>Window that has a sizing border. Same as the WS_THICKFRAME style.</summary>
        WS_SIZEBOX = WS_THICKFRAME,

        /// <summary>Same as the WS_CHILD style.</summary>
        WS_CHILDWINDOW = WS_CHILD,
        /// <summary>Overlapped window with the WS_OVERLAPPED, WS_CAPTION, WS_SYSMENU, WS_THICKFRAME, WS_MINIMIZEBOX, and WS_MAXIMIZEBOX styles.</summary>
        WS_OVERLAPPEDWINDOW = WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME | WS_MINIMIZEBOX | WS_MAXIMIZEBOX,
        /// <summary>
        /// Overlapped window with the WS_OVERLAPPED, WS_CAPTION, WS_SYSMENU, WS_THICKFRAME, WS_MINIMIZEBOX, and WS_MAXIMIZEBOX styles.
        /// Same as the WS_OVERLAPPEDWINDOW style.
        /// </summary>
        WS_TILEDWINDOW = WS_OVERLAPPEDWINDOW,
        /// <summary>
        /// Pop-up window with the WS_BORDER, WS_POPUP, and WS_SYSMENU styles.
        /// The WS_CAPTION style must be combined with the WS_POPUPWINDOW style to make the Control menu visible.
        /// </summary>
        WS_POPUPWINDOW = WS_POPUP | WS_BORDER | WS_SYSMENU,

        #region Extended Window Styles
        // http://msdn2.microsoft.com/en-us/library/ms632680.aspx

        //WS_EX_DLGMODALFRAME = 0x00000001,
        //WS_EX_NOPARENTNOTIFY = 0x00000004,
        //WS_EX_TOPMOST = 0x00000008,
        //WS_EX_ACCEPTFILES = 0x00000010,
        //WS_EX_TRANSPARENT = 0x00000020,

        //// Only with WINVER >= 0x400

        //WS_EX_MDICHILD = 0x00000040,
        //WS_EX_TOOLWINDOW = 0x00000080,
        //WS_EX_WINDOWEDGE = 0x00000100,
        //WS_EX_CLIENTEDGE = 0x00000200,
        //WS_EX_CONTEXTHELP = 0x00000400,

        //WS_EX_RIGHT = 0x00001000,
        //WS_EX_RTLREADING = 0x00002000,
        //WS_EX_LEFTSCROLLBAR = 0x00004000,

        //WS_EX_CONTROLPARENT = 0x00010000,
        //WS_EX_STATICEDGE = 0x00020000,
        //WS_EX_APPWINDOW = 0x00040000,

        //WS_EX_OVERLAPPEDWINDOW = (WS_EX_WINDOWEDGE | WS_EX_CLIENTEDGE),
        //WS_EX_PALETTEWINDOW = (WS_EX_WINDOWEDGE | WS_EX_TOOLWINDOW | WS_EX_TOPMOST),

        //// Only with WINVER >= 0x500
        ///// <summary>Disable inheritence of mirroring by children</summary>
        //WS_EX_NOINHERITLAYOUT = 0x00100000,
        ///// <summary>Right to left mirroring</summary>
        //WS_EX_LAYOUTRTL = 0x00400000,

        //// Only with _WIN32_WINNT >= 0x500
        //WS_EX_LAYERED = 0x00080000,
        //WS_EX_COMPOSITED = 0x02000000,
        //WS_EX_NOACTIVATE = 0x08000000
        #endregion
    }

    /// <summary>Extenders for the enumerations</summary>
    static class WindowEnumerationsExtender
    {
        /// <summary>Test if a windows styles contains another window styles</summary>
        public static bool Contains(this WindowStyles testedWS, WindowStyles requiredWS)
        {
            return (testedWS & requiredWS) == requiredWS;
        }
    }
}
